package com.example.filter;


import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;

import java.io.IOException;

//新创建一个这个类然后实现Filter这个接口
//注意: 是实现  jakarta.servlet.Filter  这个包下的Filter!!!
//实现Filter这个接口后要重写这个接口所有的方法


//弄好之后,要在这里加上一个@WebFilter(urlPatterns = "/*")进行拦截请求
//需要利用注解里的 urlPatterns 来指定要拦截什么样子的请求, 这里给的值是  "/*" 这个值表示要拦截所有的请求
//@Component//使用 @Component 注解可以确保这个拦截器组件被正确的扫描和注册到Spring容器中。
// 这样，在应用程序初始化的时候，Spring容器会自动实例化拦截器组件，从而调用拦截器中的 init 方法
//直白一些,需要加上这个注解执行这里的语句

@WebFilter(urlPatterns = "/login") //目前这个组件未开启,要想使用servlet的三大组件主要在启动类的类上添加一个@ServletComponentScan 表示开启的注解
public class filterDemo implements Filter {

    /**
     * 初始化方法, 只调用一次
     *
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init 初始化方法执行了");
    }

    /**
     * 这个方法是拦截到请求之后会调用,这个会调用多次
     *
     * @param servletRequest
     * @param servletResponse
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Demo拦截到了请求,拦截请求前的操作");
        //放行  刚刚拦截到请求后知识单纯的输出了语句,而数据没有展现出来,接下来将执行放行操作,将想对应的数据展现出来来进行浏览
        //这里通过filterChain来调用.doFilter(),然后将servletRequest,servletResponse这两个参数传递进去
        // ,这样就完成了放行操作
        //拦截到了请求 然后放行让用户操作
        filterChain.doFilter(servletRequest, servletResponse);

        System.out.println("Demo拦截到了请求,拦截请求后的操作");
    }

    /**
     * 销毁方法, 只调用一次
     */
    @Override
    public void destroy() {
        System.out.println("destroy 销毁方法执行了");
    }
}
